package core;


import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.Key;
import java.util.Date;
import java.util.Properties;
import tools.FucLib;
import tools.Logger;
import tools.SecLib;

/**
 * Clobal Configuration class
 * @author dcrm
 */
public class GlobalConfig {
    public static final int TYPE_ICQ=0;
    public static final int TYPE_XMPP=1;
    public static final int TYPE_PHPBB=2;
    public static final int TYPE_CHAT=3;
    public static boolean firstRun=false;

    public static String SMTP_SERVER="0";
    public static String SMTP_LOGIN="0";
    public static String SMTP_PWD="0";
    public static String SMTP_FROM="0";

    public static String i_Jid="pgta@jabber.ru";
    public static String i_Jid_Master="dcrm@jabber.ru";
    public static String i_Jid_Server="jabber.ru";
    public static int i_Jid_Port=5222;
    public static String i_Jid_Login="pgta";
    public static String i_Jid_Place="PGTA";
    private static String JID_MD5_PWD="";

    public static String x_Uin="2324312";
    public static String x_Server="login.icq.com";
    public static String x_Port="5190";
    public static String x_mUin="7360921";
    private static String ICQ_MD5_PWD="";
    private static String CHAT_PWD_MD5="";

    public static boolean F_OF_MD=true;
    public static boolean F_SEND_MSG=true;
    public static boolean F_BACK_MSG=true;
    public static boolean F_DEBUG_MSG=false;
    public static boolean F_LOG_MSG=true;
    public static boolean F_LIFE=true;
    public static boolean F_SECURITY_KEY=true;

    public static String FIL_UIN="uin.txt";
    public static String FIL_PROXY="proxy.txt";
    public static String DIR_XLS="./lib/base/current/";
    public static String DIR_LOG="./logs";

    public static String PHPBB_LOGIN_FORM="http://www2.pgta.ru/forum/ucp.php?mode=login";
    public static String PHPBB_LOGIN="DCRM";
    private static String PHPBB_PWD_MD5="";
    public static String PHPBB_POST="http://www2.pgta.ru/forum/posting.php?mode=edit&f=6&p=3040";

    public static String MSG_ERR_0="Ошибка в запросе, для начала работы пришлите: 'hi' (без ковычек :) )";
    public static String MSG_ERR_1="Запрос слишком короткий(<4), или он содержит не подходящие символы!";

    public static String INFO ="Кто меня создал:\n"
+"NAME: DCRM(Dark Crimson);\n"
+"ICQ: 7360921;\n"
+"WWW: http://x-crm.info;\n"
+"---\n"
+"Из чего я состою:\n"
+"Ядро ICQ: CaffeineIM http://code.google.com/p/caffeineim/ ;\n"
+"Ядро XMPP: Smack API http://www.igniterealtime.org/projects/smack/ ;\n"
+"Web browser:* HtmlUnit-2.7 http://htmlunit.sourceforge.net/ ;\n"
+"Парсер MS документов: http://poi.apache.org/ ;\n"
+"---\n"
+"Реквизиты:\n"
+"WM:\n"
+"R348679072599\n"
+"Z320195537694\n"
+"E820604484175\n"
+"U278616588558\n"
+"EG: 5123245";

public static String HI = "Привет! Я Информер Пензенской Государственной Технологической Академии!\n" +
"\t'pgta all' - список доступных групп;\n" +
"\t'pgta 0 06В3' (или транслитом 06v3) - как пример расписание на всю неделю группы 06В3;\n" +
"\t\t * [0-Вся неделя / 8-Текущий день / 1-Пн; 2-Вт; 3-Ср; 4-Чт; 5-Пт; 6-Сб;] *\n" +
"\t'ppd Смагин' - (или транслитом Smagin) пример запроса ФИО преподавателя;\n" +
"\t'find Смагин' - (или транслитом Smagin) пример поиска мест дислокации преподавателя;\n" +
"\t'trule' - правила транслитерации рус<>транслит;\n" +
"\t'info' - Время работы, служебная информация;\n" +
"\t'about' - О Мне :) \n\n\n" +
"* Все команды без кавычек пишите пожалуйста...\n" +
"* Если Русская кодировка не принимается, отправьте запрос транслитом! (см. правила транслитерации)\n" +
"p.s. При запросе группы, в (скобках) будет выведен аналог запроса группы транслитом :)";

public static String TRULE = "The transfer rules:\n" +
        "а<>a; б<>b; в<>v; г<>g; д<>d; е<>e;\n" +
        "ё<>jo; ж<>zh; з<>z; и<>i; й<>jj;\n\t" +
        "к<>k; л<>l; м<>m; н<>n; о<>o;\n\t" +
        "п<>p; р<>r; с<>s; т<>t; у<>u;\n\t" +
        "ф<>f; х<>kh; ц<>c; ч<>ch; ш<>sh;\n\t" +
        "щ<>sch; ъ<>-; ы<>y; ь<>\'; э<>eh;\n\t" +
        "ю<>yu; я<>ya;";

    public static final long T_GlobalStart = new Date().getTime();

    public static final String CONFILE="global.xml";
    public static final String KEYFILE="security.key";

    private static Key key = null;

    /**
     * Init Global Config.
     * Load or AutoCreate config file
     */
    public GlobalConfig() { this(CONFILE); }
    /**
     * Init Global Config.
     * Load or AutoCreate config file
     * @param confile - Config file
     */
    public GlobalConfig(String confile) {
        loadConfigFromFile(confile);
    }

    /**
     * Return password
     * @param TYPE - TYPE_ICQ/TYPE_XMPP/TYPE_PHPBB/TYPE_CHAT
     * @return String password
     */
    public static synchronized String getPWD(int TYPE) {
        switch (TYPE) {
            case TYPE_ICQ: return ICQ_MD5_PWD;
            case TYPE_XMPP: return JID_MD5_PWD;
            case TYPE_PHPBB: return PHPBB_PWD_MD5;
            case TYPE_CHAT: return CHAT_PWD_MD5;
            default: return "";
        }
    }

    /**
     * Set password
     * @param pwd - Password
     * @param TYPE - TYPE_ICQ/TYPE_XMPP/TYPE_PHPBB/TYPE_CHAT
     */
    public static synchronized void setPWD(String pwd, int TYPE) {
        switch (TYPE) {
            case TYPE_ICQ: ICQ_MD5_PWD=FucLib.getMD5(pwd); break;
            case TYPE_XMPP: JID_MD5_PWD=FucLib.getMD5(pwd); break;
            case TYPE_PHPBB: PHPBB_PWD_MD5=FucLib.getMD5(pwd); break;
            case TYPE_CHAT: CHAT_PWD_MD5=FucLib.getMD5(pwd); break;
            default: break;
        }
    }

    /**
     * Generate Key Blowfish(128)
     */
    public static synchronized void genKey() {
        try {
            key=SecLib.genBlowfishKey(128);
            Main.pr("[New Security key generated!].");
        } catch (Exception ex) {Main.pr(".[New Security key NOT generated!].");}
    }

    /**
     * Get Security key
     * @return
     */
    public static synchronized Key getKey() {
        return key;
    }

    /**
     * Save Blowfish key
     */
    public static synchronized void saveKey() {
        saveKey(KEYFILE);
    }
    /**
     * Save Blowfish key 
     * @param keyfile - Key File 
     */
    public static synchronized void saveKey(String keyfile) {
        SecLib.saveKey(key, new File(keyfile));
    }

    /**
     * Load Blowfish key
     */
    public static synchronized void loadKey() {
        loadKey(KEYFILE);
    }
    /**
     * Load Blowfish key
     * @param keyfile - Key File
     */
    public static synchronized void loadKey(String keyfile) {
        key = SecLib.loadBlowfishKey(new File(keyfile));
        if (key==null) {genKey(); saveKey(); Main.pr("[Please, download new key!].");}
        Main.pr("Security Key loaded!\n");
    }

    /**
     * Load/AutoCreate config
     */
    public static synchronized void loadConfigFromFile() { loadConfigFromFile(CONFILE); }
    /**
     * Load/AutoCreate config
     * @param confile - Config file
     */
    public static synchronized void loadConfigFromFile(String confile) {
        try {
            Properties properties = new Properties();
            FileInputStream fis = new FileInputStream(confile);
            properties.loadFromXML(fis);
            // SMTP SETTINGS
            SMTP_SERVER=properties.getProperty("smtp_server", SMTP_SERVER);
            SMTP_LOGIN=properties.getProperty("smtp_login", SMTP_LOGIN);
            SMTP_PWD=properties.getProperty("smtp_pwd", SMTP_PWD);
            SMTP_FROM=properties.getProperty("smtp_from", SMTP_FROM);
            // JABBER NODE
            i_Jid=properties.getProperty("jid", i_Jid);
            i_Jid_Master=properties.getProperty("jid_master", i_Jid_Master);
            i_Jid_Server=properties.getProperty("jid_server", i_Jid_Server);
            i_Jid_Port=Integer.parseInt(properties.getProperty("jid_port", Integer.toString(i_Jid_Port)));
            i_Jid_Login=properties.getProperty("jid_login", i_Jid_Login);
            i_Jid_Place=properties.getProperty("jid_place", i_Jid_Place);
            // ICQ NODE
            x_Uin=properties.getProperty("uin", x_Uin);
            x_mUin=properties.getProperty("icq_master", x_mUin);
            x_Server=properties.getProperty("icq_server", x_Server);
            x_Port=properties.getProperty("icq_port", x_Port);
            // BOOL NODE
            F_OF_MD=Boolean.parseBoolean(properties.getProperty("b_frame_of_mind", Boolean.toString(F_OF_MD)));
            F_SEND_MSG=Boolean.parseBoolean(properties.getProperty("b_send_message", Boolean.toString(F_SEND_MSG)));
            F_BACK_MSG=Boolean.parseBoolean(properties.getProperty("b_back_message", Boolean.toString(F_BACK_MSG)));
            F_DEBUG_MSG=Boolean.parseBoolean(properties.getProperty("b_debug_message", Boolean.toString(F_DEBUG_MSG)));
            F_LOG_MSG=Boolean.parseBoolean(properties.getProperty("b_log_message", Boolean.toString(F_LOG_MSG)));
            F_LIFE=Boolean.parseBoolean(properties.getProperty("b_life", Boolean.toString(F_LIFE)));
            F_SECURITY_KEY=Boolean.parseBoolean(properties.getProperty("b_security_key", Boolean.toString(F_SECURITY_KEY)));
            // MSG NODE
            INFO=properties.getProperty("INFO", INFO);
            HI=properties.getProperty("HI", HI);
            TRULE=properties.getProperty("TRULE", TRULE);
            MSG_ERR_0=properties.getProperty("MSG_ERR_0", MSG_ERR_0);
            MSG_ERR_1=properties.getProperty("MSG_ERR_1", MSG_ERR_1);
            // FILE NODE
            FIL_UIN=properties.getProperty("uins_file", FIL_UIN);
            FIL_PROXY=properties.getProperty("proxy_file", FIL_PROXY);
            DIR_XLS=properties.getProperty("dir_xls", DIR_XLS);
            DIR_LOG=properties.getProperty("dir_logs", DIR_LOG);
            // PHPBB NODE
            PHPBB_LOGIN_FORM=properties.getProperty("phpbb_url_login_form", PHPBB_LOGIN_FORM);
            PHPBB_LOGIN=properties.getProperty("phpbb_login", PHPBB_LOGIN);
            PHPBB_POST=properties.getProperty("phpbb_url_post", PHPBB_POST);
            // MD5 NODE
            ICQ_MD5_PWD=properties.getProperty("ICQ_MD5_PWD", "X");
            JID_MD5_PWD=properties.getProperty("JID_MD5_PWD", "X");
            PHPBB_PWD_MD5=properties.getProperty("PHPBB_PWD_MD5", "X");
            CHAT_PWD_MD5=properties.getProperty("CHAT_PWD_MD5", "X");

            fis.close();
        } catch (Exception ex) {Main.pr("[Config file not exist! .");
            Logger.writelnErr("Config file error: "+ex.getMessage());
            firstRun=true;
            saveConfigToFile(confile);
            Main.pr(".. ("+CONFILE+") created!]");
        }
    }
    /**
     * Save config
     */
    public static synchronized void saveConfigToFile() { saveConfigToFile(CONFILE); }
    /**
     * Save config
     * @param confile - Config file
     */
    public static synchronized void saveConfigToFile(String confile) {
        try {
            Properties properties = new Properties();
            // SMTP SETTINGS
            properties.setProperty("smtp_server", SMTP_SERVER);
            properties.setProperty("smtp_login", SMTP_LOGIN);
            properties.setProperty("smtp_pwd", SMTP_PWD);
            properties.setProperty("smtp_from", SMTP_FROM);
            // JABBER NODE
            properties.setProperty("jid", i_Jid);
            properties.setProperty("jid_master", i_Jid_Master);
            properties.setProperty("jid_server", i_Jid_Server);
            properties.setProperty("jid_port", Integer.toString(i_Jid_Port));
            properties.setProperty("jid_login", i_Jid_Login);
            properties.setProperty("jid_place", i_Jid_Place);
            // ICQ NODE
            properties.setProperty("uin", x_Uin);
            properties.setProperty("icq_master", x_mUin);
            properties.setProperty("icq_server", x_Server);
            properties.setProperty("icq_port", x_Port);
            // BOOL NODE
            properties.setProperty("b_frame_of_mind", Boolean.toString(F_OF_MD));
            properties.setProperty("b_send_message", Boolean.toString(F_SEND_MSG));
            properties.setProperty("b_back_message", Boolean.toString(F_BACK_MSG));
            properties.setProperty("b_debug_message", Boolean.toString(F_DEBUG_MSG));
            properties.setProperty("b_log_message", Boolean.toString(F_LOG_MSG));
            properties.setProperty("b_life", Boolean.toString(F_LIFE));
            properties.setProperty("b_security_key", Boolean.toString(F_SECURITY_KEY));
            // MSG NODE
            properties.setProperty("INFO", INFO);
            properties.setProperty("HI", HI);
            properties.setProperty("TRULE", TRULE);
            properties.setProperty("MSG_ERR_0", MSG_ERR_0);
            properties.setProperty("MSG_ERR_1", MSG_ERR_1);
            // FILE NODE
            properties.setProperty("uins_file", FIL_UIN);
            properties.setProperty("proxy_file", FIL_PROXY);
            properties.setProperty("dir_xls", DIR_XLS);
            properties.setProperty("dir_logs", DIR_LOG);
            // PHPBB NODE
            properties.setProperty("phpbb_url_login_form", PHPBB_LOGIN_FORM);
            properties.setProperty("phpbb_login", PHPBB_LOGIN);
            properties.setProperty("phpbb_url_post", PHPBB_POST);
            // MD5 NODE
            properties.setProperty("ICQ_MD5_PWD", ICQ_MD5_PWD);
            properties.setProperty("JID_MD5_PWD", JID_MD5_PWD);
            properties.setProperty("PHPBB_PWD_MD5", PHPBB_PWD_MD5);
            properties.setProperty("CHAT_PWD_MD5", CHAT_PWD_MD5);

            FileOutputStream fos = new FileOutputStream(confile);
            properties.storeToXML(fos,"ConfigFile");
            fos.close();
        } catch (Exception ex) { Logger.writelnErr(ex.getMessage()); }
    }
}
